{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Area under 1-D and 2-D curves, various methods\n", "\n", "**Randall Romero Aguilar, PhD**\n", "\n", "This demo is based on the original Matlab demo accompanying the Computational Economics and Finance 2001 textbook by Mario Miranda and Paul Fackler.\n", "\n", "Original (Matlab) CompEcon file: **demqua03.m**\n", "\n", "Running this file requires the Python version of CompEcon. This can be installed with pip by running\n", "\n", " !pip install compecon --upgrade\n", "\n", "Last updated: 2022-Oct-23\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## About\n", "\n", "Uni- and bi-vaiariate integration using Newton-Cotes, Gaussian, Monte Carlo, and quasi-Monte Carlo quadrature methods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initial tasks" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from compecon import qnwtrap, qnwsimp, qnwlege\n", "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "quadmethods = [qnwtrap, qnwsimp, qnwlege]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Make support function" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "a, b = -1, 1\n", "nlist = [5, 11, 21, 31]\n", "N = len(nlist)\n", "\n", "def quad(func, qnw, n):\n", " xi, wi = qnw(n,a,b)\n", " return np.dot(func(xi),wi)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluating\n", "$\\int_{-1}^1e^{-x}dx$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return np.exp(-x)\n", "\n", "f_quad = np.array([[quad(f, qnw, ni) for qnw in quadmethods] for ni in nlist])\n", "f_true = np.exp(1) - 1/np.exp(1)\n", "f_error = np.log10(np.abs(f_quad/f_true - 1))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Evaluating\n", "$\\int_{-1}^1\\sqrt{|x|}dx$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def g(x):\n", " return np.sqrt(np.abs(x))\n", "\n", "g_quad = np.array([[quad(g, qnw, ni) for qnw in quadmethods] for ni in nlist])\n", "g_true = 4/3\n", "g_error = np.log10(np.abs(g_quad/g_true - 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Make table with results" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Trapezoid ruleSimpson's ruleGauss-Legendre
$\\int_{-1}^1e^{-x}dx$5-1.683044-3.472173-9.454795
11-2.477411-5.053217-14.273349
21-3.079254-6.255789-14.675836
31-3.431396-6.959867-15.653560
$\\int_{-1}^1\\sqrt{|x|}dx$5-1.023788-1.367611-0.870112
11-1.595301-1.347900-1.351241
21-2.034517-2.414470-1.758970
31-2.293296-2.063539-2.007803
\n", "
" ], "text/plain": [ " Trapezoid rule Simpson's rule Gauss-Legendre\n", "$\\int_{-1}^1e^{-x}dx$ 5 -1.683044 -3.472173 -9.454795\n", " 11 -2.477411 -5.053217 -14.273349\n", " 21 -3.079254 -6.255789 -14.675836\n", " 31 -3.431396 -6.959867 -15.653560\n", "$\\int_{-1}^1\\sqrt{|x|}dx$ 5 -1.023788 -1.367611 -0.870112\n", " 11 -1.595301 -1.347900 -1.351241\n", " 21 -2.034517 -2.414470 -1.758970\n", " 31 -2.293296 -2.063539 -2.007803" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods = ['Trapezoid rule', \"Simpson's rule\", 'Gauss-Legendre']\n", "functions = [r'$\\int_{-1}^1e^{-x}dx$', r'$\\int_{-1}^1\\sqrt{|x|}dx$']\n", "\n", "results = pd.concat(\n", " [pd.DataFrame(errors, columns=methods, index=nlist) for errors in (f_error, g_error)],\n", " keys=functions)\n", "\n", "results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot the functions" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "a, b, n = -1, 1, 301\n", "x = np.linspace(a, b, n)\n", "\n", "options = dict(xlim=[a,b], xticks=[-1,0,1], yticks=[0])\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=[10,4])\n", "axs[0].plot(x, f(x), linewidth=3)\n", "axs[0].set(title='$e^{-x}$', ylim=[0,f(a)], **options)\n", "\n", "axs[1].plot(x, g(x), linewidth=3)\n", "axs[1].set(title='$\\sqrt{|x|}$', ylim=[0,g(a)], **options);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.7 ('base')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "vscode": { "interpreter": { "hash": "ad2bdc8ecc057115af97d19610ffacc2b4e99fae6737bb82f5d7fb13d2f2c186" } } }, "nbformat": 4, "nbformat_minor": 4 }